﻿namespace KinonekoSoftware.CodariaDB.Utils
{
    public interface IHierarchicalObject
    {
        /*
         * JuXiaoYou里会用到树形结构重建，由于不想要更复杂的实现方式所以就使用了这个版本的抽象。
         *
         * 1. 首先将所有节点添加到字典当中 Dictionary<string, T>
         * 2. 遍历所有的节点，
         *      a) 如果是根元素则添加到 根元素的集合 （一般称之为rebuildCollection）
         *      b) 如果有父节点则添加到 父节点的集合 中
         *      c) 忽略
         * 3. 顺序重建【可选步骤】
         *      a) 用递归的方式遍历所有节点
         *      b) 将所有节点都添加到一个Queue
         *      c) 将所有节点的Index都添加到一个HashSet，如果有冲突则开始重建
         *          d) 重建，一边添加一边记录当前的index
         *          f) 直接添加，根据index插入
         */

        /// <summary>
        /// 判断是否为根元素
        /// </summary>
        /// <returns>返回当前元素是否为根元素，如果是则返回true，否则返回false。</returns>
        bool IsRoot();

        /// <summary>
        /// 判断是否有父元素
        /// </summary>
        /// <returns>返回当前元素是否有父元素，如果是则返回true，否则返回false。</returns>
        bool HasParent();

        /// <summary>
        /// 获得ID
        /// </summary>
        /// <returns>返回父元素的ID</returns>
        string GetID();

        /// <summary>
        /// 获得父元素的ID
        /// </summary>
        /// <returns>返回父元素的ID</returns>
        /// <remarks>注意：如果<see cref="HasParent"/>返回false，则该方法的返回值为null。</remarks>
        string GetParentID();

        /// <summary>
        /// 添加属性到父元素
        /// </summary>
        /// <param name="child">要添加的属性。</param>
        void AppendChild(IHierarchicalObject child);
    }

    public interface IOrderedHierarchicalObject : IHierarchicalObject
    {
        bool HasChildren();


        IOrderedHierarchicalObject this[int index] { get; set; }
        int Count { get; }
        int Index { get; set; }
    }
}